home *** CD-ROM | disk | FTP | other *** search
- '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- '* *
- '* QB4DIR.BAS *
- '* *
- '* Disk Directory Routines *
- '* written with Microsoft QuickBASIC v4.00b *
- '* *
- '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- '* *
- '* NOTE: *
- '* *
- '* THIS PROGRAM, ITS USE, OPERATION, AND SUPPORT IS PROVIDED "AS IS" *
- '* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, *
- '* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND *
- '* FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY *
- '* AND PERFORMANCE OF THIS PROGRAM IS WITH THE USER. IN NO EVENT SHALL *
- '* MICROSOFT BE LIABLE FOR DAMAGES INCLUDING, WITHOUT LIMITATION, ANY *
- '* LOST PROFITS, LOST SAVINGS, OR OTHER INCIDENTAL OR CONSEQUENTIAL *
- '* DAMAGES ARISING FROM THE USE OR INABILITY TO USE THIS PROGRAM, EVEN *
- '* IF MICROSOFT HAS BEEN ADVISED OF THE POSSIBILTY OF SUCH DAMAGES, OR *
- '* FOR ANY CLAIM BY ANY OTHER PARTY. *
- '* *
- '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- '
- '
- 'QuickBASIC 4.0 Disk Directory routine
- 'By Kyle Sparks, Microsoft 1988
- '
- 'for use inside the QB4 environment, must have QB.QLB Quick Library loaded
- '
- '************************************************************************
-
- DEFINT A-Z
-
- '----------------------------- Define Types -----------------------------
-
- TYPE FileFindBuf 'DTA Buffer
- DOS AS STRING * 19 'first 20 bytes reserved
- CreateTime AS STRING * 1 'by DOS
- Attributes AS INTEGER 'Attribute of file
- AccessTime AS INTEGER 'Last access time of file
- AccessDate AS INTEGER 'Last access date of file
- FileSize AS LONG 'Size of file in bytes
- FileName AS STRING * 13 'File name XXXXXXXX.XXX
- END TYPE
-
- TYPE Register 'Type for use with Interrupt
- ax AS INTEGER
- bx AS INTEGER
- cx AS INTEGER
- dx AS INTEGER
- bp AS INTEGER
- si AS INTEGER
- di AS INTEGER
- flags AS INTEGER
- ds AS INTEGER
- es AS INTEGER
- END TYPE
-
- '------------------------- Dimension Variables --------------------------
-
- DIM BUFFER AS FileFindBuf
- DIM InReg AS Register, OutReg AS Register
- DIM k(255) AS STRING
-
- '-------------------------- Declare Procedures --------------------------
-
- DECLARE FUNCTION FirstFM (Path$, FA%) 'Searches for First File Match
- DECLARE FUNCTION GetDrive$ () 'Gets default drive
- DECLARE FUNCTION GetPath$ (Drive$) 'Gets default path on Drive$
- DECLARE FUNCTION NextFM () 'Searches for Next File Match
- DECLARE FUNCTION WDate$ (d%) 'Converts Date
- DECLARE FUNCTION WTime$ (t%) 'Converts Time
- DECLARE SUB DIR (Path$, k() AS STRING, FA%) 'Dir Control Module
- DECLARE SUB InitBuf (BUFFER AS FileFindBuf) 'Initializes buffer
- DECLARE SUB SetDTA (BUF AS ANY) 'Sets the Data Transfer Area
-
- DECLARE SUB Interrupt (IntNo%, InRegs AS Register, OutRegs AS Register)
- DECLARE SUB InterruptX (IntNo%, InRegs AS Register, OutRegs AS Register)
-
- '------------------------------------------------------------------------
-
- FA% = 0 'File Attribute to search for
- '&h00 = Normal
- '&h08 = Volume Label Only
- '&h10 = Files and Directories
-
- DIR "*.bas", k(), FA% 'Get Directory
-
- SUB DIR (Path$, DirArray() AS STRING, FA%)
- '------------------------------------------------------------------------
- ' procedure DIR manages other procedures and loads an array with the
- ' file names and information for files that match the search string.
- '
- ' Path$ is the search string for the DIR
- '
- '------------------------------------------------------------------------
-
- DIM BUFFER AS FileFindBuf
-
- SetDTA BUFFER
-
- Counter = 0
- IF (FirstFM(Path$, FA%) = 0) THEN
- DO
-
- Counter = Counter + 1
- s = INSTR(BUFFER.FileName, ".")
-
- DirArray(Counter) = SPACE$(43)
- MID$(DirArray(Counter), 1, LEN(BUFFER.FileName)) = BUFFER.FileName
- IF BUFFER.Attributes = 4096 THEN
- MID$(DirArray(Counter), 15, 9) = "<DIR>"
- ELSE
- MID$(DirArray(Counter), 15, 8) = SPACE$(8 - LEN(RTRIM$(LTRIM$(STR$(BUFFER.FileSize))))) + RTRIM$(LTRIM$(STR$(BUFFER.FileSize)))
- END IF
-
- MID$(DirArray(Counter), 25, 10) = WDate$(BUFFER.AccessDate)
- MID$(DirArray(Counter), 38, 6) = WTime$(BUFFER.AccessTime)
-
- InitBuf BUFFER 'Clear Buffer
-
- LOOP WHILE (NextFM = 0) AND Counter < 255
-
- END IF
-
- END SUB
-
- FUNCTION FirstFM (Path$, FA%) 'Find First Match
- '------------------------------------------------------------------------
- ' function FirstFM returns a zero if the search for first file match
- ' was successful.
- '------------------------------------------------------------------------
-
- DIM InReg AS Register, OutReg AS Register
- InReg.ax = &H4E00
- InReg.cx = FA%
- FileName$ = Path$ + CHR$(0)
- InReg.dx = SADD(FileName$)
- Interrupt &H21, InReg, OutReg 'Find First Match
- FirstFM = OutReg.ax
-
- END FUNCTION
-
- FUNCTION GetDrive$
- '------------------------------------------------------------------------
- ' function GetDrive$ returns the current active DOS drive letter.
- '------------------------------------------------------------------------
-
- DIM regs AS Register
- regs.ax = &H1900
- Interrupt &H21, regs, regs
- GetDrive$ = CHR$(65 + regs.ax MOD 256)
-
- END FUNCTION
-
- FUNCTION GetPath$ (Drive$)
- '------------------------------------------------------------------------
- ' function GetPath$ returns the current active DOS path on the specified
- '------------------------------------------------------------------------
-
- DIM regs AS Register, sb AS STRING * 64
- regs.ax = &H4700
- regs.dx = ASC(Drive$) - 64
- regs.ds = VARSEG(sb)
- regs.si = VARPTR(sb)
- InterruptX &H21, regs, regs
- GetPath$ = LEFT$(sb, INSTR(sb, CHR$(0)) - 1)
-
- END FUNCTION
-
- SUB InitBuf (BUFFER AS FileFindBuf) STATIC
- '------------------------------------------------------------------------
- ' procedure InitBuf initializes the DTA buffer.
- '------------------------------------------------------------------------
-
- ' the first 20 bytes are reserved for DOS and are unchanged
- BUFFER.CreateTime = " "
- BUFFER.Attributes = 0
- BUFFER.AccessTime = 0
- BUFFER.AccessDate = 0
- BUFFER.FileSize = 0
- BUFFER.FileName = STRING$(13, 32)
-
- END SUB
-
- FUNCTION NextFM STATIC
- '------------------------------------------------------------------------
- ' function NextFM returns a zero if the search for the next file match
- ' was successful.
- '------------------------------------------------------------------------
-
- DIM InReg AS Register, OutReg AS Register
- InReg.ax = &H4F00
- InReg.cx = FA%
- FileName$ = Path$ + CHR$(0)
- InReg.dx = SADD(FileName$)
- Interrupt &H21, InReg, OutReg
- NextFM = OutReg.ax AND &HF
-
- END FUNCTION
-
- SUB SetDTA (BUFFER AS FileFindBuf) STATIC
- '------------------------------------------------------------------------
- ' procedure SetDTA sets up the Disk Transfer Area, where the file info
- ' for each file will be stored.
- '------------------------------------------------------------------------
-
- DIM InReg AS Register, OutReg AS Register
-
- InitBuf BUFFER
-
- InReg.ax = &H1A00
- InReg.ds = VARSEG(BUFFER)
- InReg.dx = VARPTR(BUFFER)
-
- InterruptX &H21, InReg, OutReg
-
- END SUB
-
- FUNCTION WDate$ (d%) STATIC
- '------------------------------------------------------------------------
- ' function WDate$ converts the encoded date returned by FindFirst or
- ' FindNext in BUFFER.Date into a date that is understandable.
- '------------------------------------------------------------------------
-
- DIM dl AS LONG
-
- IF d% >= 0 THEN
- dl = d%
- ELSE
- dl = 65536 + d%
- END IF
- mn = (dl \ 2 ^ 5) AND (&HF)
- IF mn < 10 THEN
- mn$ = "0" + LTRIM$(STR$(mn))
- ELSE
- mn$ = LTRIM$(STR$(mn))
- END IF
- dy = dl AND (&H1F)
- IF dy < 10 THEN
- dy$ = "0" + LTRIM$(STR$(dy))
- ELSE
- dy$ = LTRIM$(STR$(dy))
- END IF
- yr$ = STR$((dl \ 2 ^ 9) + 1980)
- WDate$ = mn$ + "/" + dy$ + "/" + LTRIM$(yr$)
-
- END FUNCTION
-
- FUNCTION WTime$ (d%) STATIC
- '------------------------------------------------------------------------
- ' function WDate$ converts the encoded time returned by FindFirst or
- ' FindNext in BUFFER.Time into a time that is understandable.
- '------------------------------------------------------------------------
-
- DIM dl AS LONG
-
- IF d% >= 0 THEN
- dl = d%
- ELSE
- dl = 65536 + d%
- END IF
- hr = (dl \ 2 ^ 11) AND (&H1F)
- IF hr >= 12 THEN
- pf$ = "p"
- hr = hr - 12
- IF hr = 0 THEN hr = 12
- ELSE
- pf$ = "a"
- END IF
- IF hr < 10 THEN
- hr$ = "0" + LTRIM$(STR$(hr))
- ELSE
- hr$ = LTRIM$(STR$(hr))
- END IF
- mt = ((dl \ 2 ^ 5) AND (&H3F))
- IF mt < 10 THEN
- mt$ = "0" + LTRIM$(STR$(mt))
- ELSE
- mt$ = LTRIM$(STR$(mt))
- END IF
- WTime$ = LTRIM$(hr$) + ":" + mt$ + pf$
- END FUNCTION
-
-